﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections;
using VisionEstereo.SegmentacionColores;
using System.Windows.Forms;
using System.IO;
using System.Drawing;

namespace VisionEstereo.AlgoritmoCorrelacion
{
    /// <summary>
    /// Lógica de interacción para EsquemaCorrelacion.xaml
    /// </summary>
    public partial class EsquemaCorrelacion : Page
    {

        private System.Drawing.Bitmap mapaDisparidades, mapaClases;
       

        private App.TipoAlgoritmo tipoAlgoritmo;
    
        private int[,] matrizClases, matrizDisparidades;
        private ArrayList listaClases;
        private int ancho, alto;
        public PixelDato[] coloresClases;
        private int[,] mapaDisp;
        private bool DisparidadesCargadas, ClasesCargadas;

        // private int NumeroClases;
        public EsquemaCorrelacion()
        {
            InitializeComponent();
            
        }
        
        
        public void setMapaDisparidades(int[,] aux)
        {
            mapaDisp = aux;
        }

        /*-- Creamos la matriz de disparidades a partir del BitMap resultado--*/
        public void setMapaDisparidades(Bitmap mapDisp,Bitmap resul)//,Bitmap resul)
        {
           this.mapaDisparidades = resul;
            int ancho = mapDisp.Width;
            int alto = mapDisp.Height;
            matrizDisparidades = new int[ancho,alto];
            for (int i = 0; i < ancho; i++)
                for (int j = 0; j < alto; j++)
                    matrizDisparidades[i, j] = mapDisp.GetPixel(i, j).R;
        }
        /*-- Creamos la matriz de Segmentación de colores a partir del BitMap resultado--*/
        internal void setMapaSegmentacion(int[,] Clases,Bitmap mapaSegmentacion)
        {
           
            mapaClases = mapaSegmentacion;
            matrizClases = Clases;
        }

        public void setImagenResultado(BitmapSource resultado)
        {
            this.imagenResul.Fill = new ImageBrush(resultado); 
        }

        public void setImagenDisparidad(BitmapSource mapaDisparidad)
        {
            this.imagenDisparidad.Fill = new ImageBrush(mapaDisparidad); 
        
        }
        public void setImagenClases(BitmapSource mapaClases)
        {
        
            this.imagenColores.Fill = new ImageBrush(mapaClases);  
        }


        public void setTipoAlgoritmo(App.TipoAlgoritmo tipoAlgoritmo)
        {
            this.tipoAlgoritmo = tipoAlgoritmo;
        }

        public void setColoresClases()
        {
            Clase obj;
            int cont = 0;
            coloresClases = new PixelDato[listaClases.Count];
            IEnumerator objMyEnum = listaClases.GetEnumerator();
            while (objMyEnum.MoveNext())
            {
                obj = (Clase)objMyEnum.Current;
                this.coloresClases[cont] = obj.getCentro();
                cont++;
            }
        }
        
       
        //----copiamos matriz de clases--------//
        public void setImagenClases(int[,] m)
        {
            this.matrizClases = m;
        }
        ///------------------------Poner etiqueta Numero de clases-------------------------------------///
        
        public void setListaClases(ArrayList lista)
        {
            this.listaClases = lista;
        }
        public void setTamañoImagenReal(int x, int y)
        {
            ancho = x;
            alto = y;
        }
        
        /*--------------EVENTOS BOTONES --------------------------------------------------------------*/

        private void botonHome_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            
            PantallaInicial pagInicio = new PantallaInicial();
            this.NavigationService.Navigate(pagInicio);
            
        }
       
     
           

        private void botonDisparidades_Click(object sender, RoutedEventArgs e)
        {
            /*Ejecutamos el algoritmo de Lankton 2 para obtener el mapa de disparidades*/
            AlgLanktonParametros lankParametros = new AlgLanktonParametros(true);
            lankParametros.setEsquemaAlg(this);
            this.NavigationService.Navigate(lankParametros);
            DisparidadesCargadas = true;
        }

        private void botonSegmentacion_Click(object sender, RoutedEventArgs e)
        {
            SeleccionImagen seleccionImagen = new SeleccionImagen();
            seleccionImagen.setEsquemaAlg(this);
            this.NavigationService.Navigate(seleccionImagen);
            ClasesCargadas = true;

        }

        private void botonEjecutar_Click(object sender, RoutedEventArgs e)
        {
            // Validamos que el usuario haya cargado las dos imágenes (disparidad y segmentación)
            if (!DisparidadesCargadas || !ClasesCargadas)
            {
                MensajeError error = new MensajeError();
                error.WindowStartupLocation = WindowStartupLocation.CenterScreen;
                error.setMensajeError("No se ha cargado el mapa de disparidad - Debe ejecutar el algoritmo de Lankton antes de continuar.");
                error.ShowDialog();
            }
            else if (!ClasesCargadas)
            {
                MensajeError error = new MensajeError();
                error.WindowStartupLocation = WindowStartupLocation.CenterScreen;
                error.setMensajeError("No se ha cargado el mapa de Segmentación de Ccolores - Debe ejecutar el algoritmo de Segmentación antes de continuar.");
                error.ShowDialog();
            }
            else
            {
                AlgoritmoCorrelacion.AlgCorrelacion correlacion = new AlgoritmoCorrelacion.AlgCorrelacion();
                Bitmap Result = correlacion.EjecutarAlgCorrelacion(mapaDisparidades, mapaClases, matrizDisparidades, matrizClases);
                System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(Result.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
                this.setImagenResultado(bitmapSource);
            }
        }


    }
}
